//>>built
define("dojox/date/islamic", ["..", "dojo/_base/lang", "dojo/date", "./islamic/Date"], function (_1, _2, dd, _3) {
    var _4 = _2.getObject("date.islamic", true, _1);
    _4.getDaysInMonth = function (_5) {
        return _5.getDaysInIslamicMonth(_5.getMonth(), _5.getFullYear());
    };
    _4.compare = function (_6, _7, _8) {
        if (_6 instanceof _3) {
            _6 = _6.toGregorian();
        }
        if (_7 instanceof _3) {
            _7 = _7.toGregorian();
        }
        return dd.compare.apply(null, arguments);
    };
    _4.add = function (_9, _a, _b) {
        var _c = new _3(_9);
        switch (_a) {
            case "day":
                _c.setDate(_9.getDate() + _b);
                break;
            case "weekday":
                var _d = _9.getDay();
                if (((_d + _b) < 5) && ((_d + _b) > 0)) {
                    _c.setDate(_9.getDate() + _b);
                } else {
                    var _e = 0, _f = 0;
                    if (_d == 5) {
                        _d = 4;
                        _f = (_b > 0) ? -1 : 1;
                    } else {
                        if (_d == 6) {
                            _d = 4;
                            _f = (_b > 0) ? -2 : 2;
                        }
                    }
                    var add = (_b > 0) ? (5 - _d - 1) : -_d;
                    var _10 = _b - add;
                    var div = parseInt(_10 / 5);
                    if (_10 % 5 != 0) {
                        _e = (_b > 0) ? 2 : -2;
                    }
                    _e = _e + div * 7 + _10 % 5 + add;
                    _c.setDate(_9.getDate() + _e + _f);
                }
                break;
            case "year":
                _c.setFullYear(_9.getFullYear() + _b);
                break;
            case "week":
                _b *= 7;
                _c.setDate(_9.getDate() + _b);
                break;
            case "month":
                var _11 = _9.getMonth();
                _c.setMonth(_11 + _b);
                break;
            case "hour":
                _c.setHours(_9.getHours() + _b);
                break;
            case "minute":
                _c._addMinutes(_b);
                break;
            case "second":
                _c._addSeconds(_b);
                break;
            case "millisecond":
                _c._addMilliseconds(_b);
                break;
        }
        return _c;
    };
    _4.difference = function (_12, _13, _14) {
        _13 = _13 || new _3();
        _14 = _14 || "day";
        var _15 = _13.getFullYear() - _12.getFullYear();
        var _16 = 1;
        switch (_14) {
            case "weekday":
                var _17 = Math.round(_4.difference(_12, _13, "day"));
                var _18 = parseInt(_4.difference(_12, _13, "week"));
                var mod = _17 % 7;
                if (mod == 0) {
                    _17 = _18 * 5;
                } else {
                    var adj = 0;
                    var _19 = _12.getDay();
                    var _1a = _13.getDay();
                    _18 = parseInt(_17 / 7);
                    mod = _17 % 7;
                    var _1b = new _3(_12);
                    _1b.setDate(_1b.getDate() + (_18 * 7));
                    var _1c = _1b.getDay();
                    if (_17 > 0) {
                        switch (true) {
                            case _19 == 5:
                                adj = -1;
                                break;
                            case _19 == 6:
                                adj = 0;
                                break;
                            case _1a == 5:
                                adj = -1;
                                break;
                            case _1a == 6:
                                adj = -2;
                                break;
                            case (_1c + mod) > 5:
                                adj = -2;
                        }
                    } else {
                        if (_17 < 0) {
                            switch (true) {
                                case _19 == 5:
                                    adj = 0;
                                    break;
                                case _19 == 6:
                                    adj = 1;
                                    break;
                                case _1a == 5:
                                    adj = 2;
                                    break;
                                case _1a == 6:
                                    adj = 1;
                                    break;
                                case (_1c + mod) < 0:
                                    adj = 2;
                            }
                        }
                    }
                    _17 += adj;
                    _17 -= (_18 * 2);
                }
                _16 = _17;
                break;
            case "year":
                _16 = _15;
                break;
            case "month":
                var _1d = (_13.toGregorian() > _12.toGregorian()) ? _13 : _12;
                var _1e = (_13.toGregorian() > _12.toGregorian()) ? _12 : _13;
                var _1f = _1d.getMonth();
                var _20 = _1e.getMonth();
                if (_15 == 0) {
                    _16 = _1d.getMonth() - _1e.getMonth();
                } else {
                    _16 = 12 - _20;
                    _16 += _1f;
                    var i = _1e.getFullYear() + 1;
                    var e = _1d.getFullYear();
                    for (i; i < e; i++) {
                        _16 += 12;
                    }
                }
                if (_13.toGregorian() < _12.toGregorian()) {
                    _16 = -_16;
                }
                break;
            case "week":
                _16 = parseInt(_4.difference(_12, _13, "day") / 7);
                break;
            case "day":
                _16 /= 24;
            case "hour":
                _16 /= 60;
            case "minute":
                _16 /= 60;
            case "second":
                _16 /= 1000;
            case "millisecond":
                _16 *= _13.toGregorian().getTime() - _12.toGregorian().getTime();
        }
        return Math.round(_16);
    };
    return _4;
});
